home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Programming / EasyPLUGINs / source / dclistview.e < prev    next >
Text File  |  1997-12-14  |  7KB  |  261 lines

  1. OPT MODULE, PREPROCESS, OSVERSION=37
  2.  
  3. MODULE 'gadtools', 'libraries/gadtools', 'devices/inputevent',
  4.        'intuition/gadgetclass', 'intuition/intuition', 'utility/tagitem',
  5.        'tools/EasyGUI', 'tools/textlen', 'tools/ctype', 'exec/nodes',
  6.        'exec/lists'
  7.  
  8. MODULE 'utility'
  9.  
  10. ->define DCLIST to make EasyGUI's gadget list more readable!
  11. EXPORT CONST DCLIST=PLUGIN
  12.  
  13. EXPORT OBJECT dclistview_plugin OF plugin PRIVATE
  14.  
  15.   label
  16.   key
  17.   relx
  18.   rely
  19.   execlist
  20.   current
  21.   top
  22.   disabled
  23.  
  24.   listview:PTR TO gadget
  25.  
  26.   labelhi
  27.   
  28.   dclick
  29.   clicked
  30.  
  31.   maxnode
  32.   
  33.   second1, micros1
  34.   second2, micros2
  35.   vers
  36.  
  37. ENDOBJECT
  38.  
  39. -> PROGRAMMER_ID | MODULE_ID
  40. ->      $01      |   $FE
  41.  
  42.  
  43. EXPORT ENUM PLA_DCListView_Label=$810FE001,       ->[I..]
  44.             PLA_DCListView_Key,                   ->[I..]
  45.             PLA_DCListView_RelativeX,             ->[I..]
  46.             PLA_DCListView_RelativeY,             ->[I..]
  47.             PLA_DCListView_ExecList,              ->[ISG]
  48.             PLA_DCListView_Current,               ->[ISG]
  49.             PLA_DCListView_Top,                   ->[.S.]
  50.             PLA_DCListView_DoubleClick,           ->[IS.]
  51.             PLA_DCListView_Disabled               ->[ISG]
  52.  
  53.  
  54. PROC dclistview(tags=NIL:PTR TO tagitem) OF dclistview_plugin
  55.  
  56.     DEF key:PTR TO CHAR, relx, rely, current
  57.  
  58.     IF utilitybase
  59.  
  60.         self.label  := GetTagData(PLA_DCListView_Label, NIL, tags)
  61.  
  62.         key         := GetTagData(PLA_DCListView_Key, NIL, tags)
  63.         self.key    := (IF isalpha(tolower(key)) THEN key ELSE NIL)
  64.  
  65.         relx        := GetTagData(PLA_DCListView_RelativeX, 5, tags)
  66.         rely        := GetTagData(PLA_DCListView_RelativeY, 2, tags)
  67.  
  68.         self.relx   := IF relx>=5 THEN relx ELSE 5
  69.         self.rely   := IF rely>=2 THEN rely ELSE 2
  70.  
  71.         self.execlist := GetTagData(PLA_DCListView_ExecList, NIL, tags)
  72.         self.maxnode:=max_node(self.execlist)
  73.  
  74.         current     := GetTagData(PLA_DCListView_Current, -1, tags)
  75.         self.current:= IF current>=0 THEN current ELSE -1
  76.  
  77.         self.top    := -1
  78.  
  79.         self.dclick := GetTagData(PLA_DCListView_DoubleClick, NIL, tags)
  80.  
  81.         self.disabled := GetTagData(PLA_DCListView_Disabled, FALSE, tags)
  82.  
  83.     ELSE
  84.  
  85.         Raise("util")
  86.  
  87.     ENDIF
  88.  
  89.     self.second1:=NIL
  90.     self.second2:=NIL
  91.  
  92.     self.micros1:=NIL
  93.     self.micros2:=NIL
  94.  
  95.     self.vers:=KickVersion(39)
  96.  
  97. ENDPROC
  98.  
  99. PROC end() OF dclistview_plugin IS EMPTY
  100.  
  101. PROC min_size(ta,fh) OF dclistview_plugin
  102.   self.labelhi:=IF self.label THEN fh+5 ELSE 0
  103. ENDPROC Max(textlen_key(self.label,ta,self.key),self.relx*fh), self.rely*fh+self.labelhi+5
  104.  
  105. PROC will_resize() OF dclistview_plugin IS (RESIZEX OR RESIZEY)
  106.  
  107. PROC gtrender(gl,vis,ta,x,y,xs,ys,w) OF dclistview_plugin HANDLE
  108.   self.listview:=CreateGadgetA(LISTVIEW_KIND,gl,
  109.                  [x,y+self.labelhi,xs,ys-self.labelhi,self.label,
  110.                      ta,0,0,vis,NIL]:newgadget,
  111.                  [GTLV_LABELS, self.execlist,
  112.                   GA_DISABLED, self.disabled,
  113.                   IF self.key THEN GT_UNDERSCORE ELSE TAG_IGNORE, "_",
  114.                   GTLV_SELECTED, self.current,
  115.                   GTLV_SHOWSELECTED, NIL,
  116.                   IF self.vers THEN GTLV_MAKEVISIBLE ELSE GTLV_TOP, (IF self.top>=0 THEN self.top ELSE Max(self.current,0)),
  117.                   TAG_DONE])
  118.   IF self.listview=NIL THEN Raise("dclv") 
  119. EXCEPT DO
  120.   ReThrow()
  121. ENDPROC self.listview
  122.  
  123. PROC message_test(imsg:PTR TO intuimessage,win:PTR TO window) OF dclistview_plugin
  124. DEF islist=FALSE
  125. IF ((imsg.class=IDCMP_VANILLAKEY) AND Not(self.disabled)) THEN RETURN (self.key=tolower(imsg.code))
  126. IF (imsg.class=IDCMP_GADGETUP)
  127.   IF islist:= (imsg.iaddress=self.listview)
  128.     self.second2:=imsg.seconds
  129.     self.micros2:=imsg.micros
  130.   ENDIF              
  131. ENDIF
  132. ENDPROC islist
  133.  
  134. PROC message_action(class,qual,code,win:PTR TO window) OF dclistview_plugin
  135. DEF newcurrent, func:PTR TO LONG
  136. SELECT class
  137.   CASE IDCMP_VANILLAKEY
  138.     self.clicked:=FALSE
  139.     IF (qual AND (IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))
  140.       newcurrent:=Max(self.current-1, 0)
  141.     ELSE
  142.       newcurrent:=Min(self.current+1, self.maxnode)
  143.     ENDIF
  144.     IF newcurrent=self.current THEN RETURN FALSE ELSE self.current:=newcurrent
  145.     Gt_SetGadgetAttrsA(self.listview,self.gh.wnd,NIL,[GTLV_SELECTED,self.current,
  146.                                                       IF self.vers THEN GTLV_MAKEVISIBLE ELSE GTLV_TOP, self.current,
  147.                                                       TAG_DONE])
  148.   CASE IDCMP_GADGETUP
  149.     IF code=self.current
  150.       self.clicked:=(IF self.clicked THEN FALSE ELSE DoubleClick(self.second1,self.micros1,self.second2,self.micros2))
  151.  
  152.         IF self.clicked AND (self.dclick<>NIL)
  153.  
  154.             func:=self.dclick
  155.  
  156.             func(self, self.current)
  157.  
  158.             RETURN FALSE
  159.  
  160.         ENDIF
  161.  
  162.     ELSE
  163.       self.current:=code
  164.     ENDIF
  165. ENDSELECT
  166.   self.second1:=self.second2
  167.   self.micros1:=self.micros2
  168.   self.second2:=NIL
  169.   self.micros2:=NIL
  170. ENDPROC TRUE
  171.  
  172. ->> dclistview_plugin: set() & get()
  173.  
  174. PROC set(attr, value) OF dclistview_plugin
  175.  
  176.     SELECT attr
  177.  
  178.         CASE PLA_DCListView_DoubleClick
  179.  
  180.             IF self.dclick<>value THEN self.dclick:=value
  181.  
  182.         CASE PLA_DCListView_ExecList
  183.  
  184.             IF (self.execlist<>value) AND (self.gh.wnd AND self.listview)
  185.  
  186.                 self.execlist:=value
  187.                 self.maxnode:=max_node(self.execlist)
  188.                 self.clicked:=FALSE
  189.  
  190.                 Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL, [GTLV_LABELS, self.execlist, TAG_DONE])
  191.  
  192.             ENDIF
  193.  
  194.         CASE PLA_DCListView_Current
  195.  
  196.             IF (self.current<>value) AND (self.gh.wnd AND self.listview)
  197.  
  198.                 self.current:= Bounds(value, -1, self.maxnode)
  199.                 self.clicked:=FALSE
  200.  
  201.                 Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL,
  202.                                    [GTLV_SELECTED, self.current,
  203.                                     IF self.vers THEN GTLV_MAKEVISIBLE ELSE GTLV_TOP, Max(self.current, 0),
  204.                                     TAG_DONE])
  205.             
  206.             ENDIF
  207.  
  208.         CASE PLA_DCListView_Top
  209.  
  210.             IF (self.gh.wnd AND self.listview)
  211.  
  212.                 Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL,
  213.                                    [GTLV_TOP, value,
  214.                                     TAG_DONE])
  215.  
  216.             ENDIF
  217.  
  218.         CASE PLA_DCListView_Disabled
  219.  
  220.             IF (self.vers AND (self.disabled<>value)) AND (self.gh.wnd AND self.listview)
  221.  
  222.                 self.disabled:=value
  223.                 self.clicked:=FALSE
  224.  
  225.                 Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL,
  226.                                    [GA_DISABLED, self.disabled,
  227.                                     TAG_DONE])
  228.  
  229.             ENDIF
  230.  
  231.     ENDSELECT
  232.  
  233. ENDPROC
  234.  
  235. PROC get(attr) OF dclistview_plugin
  236.  
  237.     SELECT attr
  238.  
  239.         CASE PLA_DCListView_Current;        RETURN self.current, TRUE
  240.         CASE PLA_DCListView_ExecList;       RETURN self.execlist, TRUE
  241.         CASE PLA_DCListView_Disabled;       RETURN self.disabled, TRUE
  242.  
  243.     ENDSELECT
  244.  
  245. ENDPROC -1, FALSE
  246.  
  247. -><
  248.  
  249. PROC max_node(list:PTR TO lh)
  250. DEF node:PTR TO ln, i=NIL
  251.   IF list>0
  252.     node:=list.head
  253.     WHILE node.succ
  254.       node:=node.succ
  255.       INC i
  256.     ENDWHILE
  257.   DEC i
  258.   ENDIF
  259. ENDPROC i
  260.  
  261.